package com.skt.domain.DTO;

import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Email;

/**
 * 用户数据传输对象（用于接收前端提交的用户信息，如注册、更新等）
 * LoginDTO 专用于登录认证（只含用户名和密码），UserDTO 用于用户信息的创建或更新（含完整用户属性）
 *
 * DB（数据库表）：存储持久化数据的源头。
 * PO（Persistent Object）：与数据库表结构完全一致，用于 ORM 框架操作数据库。
 * DTO（Data Transfer Object）：接收前端传入的数据，用于业务处理（如注册、更新），字段由前端输入需求决定。
 * VO（View Object）：返回给前端展示的数据，字段由前端展示需求决定，绝不包含敏感信息（如密码）。
 *
 * PO 不直接暴露给外部，仅在数据访问层（DAO/Repository）和业务层（Service）内部使用；
 * DTO 和 VO 通常由 PO 转换而来，可通过 MapStruct、BeanUtils 或手动转换；
 * DTO 可能包含校验注解（如 @NotBlank），VO 通常不含校验逻辑；
 * 一个实体可能对应多个 DTO/VO（如 UserRegisterDTO、UserUpdateDTO、UserSimpleVO）。
 */
@Data
public class UserDTO {

    /**
     * 用户名
     */
    @NotBlank(message = "用户名不能为空")
    private String username;

    /**
     * 真实姓名
     */
    @NotBlank(message = "真实姓名不能为空")
    private String realName;

    /**
     * 手机号（简单校验格式）
     */
    @NotBlank(message = "手机号不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phone;

    /**
     * 邮箱（可选，但若提供需格式正确）
     */
    @Email(message = "邮箱格式不正确")
    private String email;

    /**
     * 密码（注册或重置时使用）
     * 注意：更新用户信息时可能不需要传密码
     */
    private String password;

    /**
     * 角色：1-普通用户，2-管理员（通常仅管理员可设置）
     */
    private Byte role;

    /**
     * 状态：1-正常，0-禁用（通常仅管理员可设置）
     */
    private Byte status;
}